统计安装了新冠病毒接触追踪应用程序(COCOA)的手机数量
首先
大约在2020年7月,我在Mac的Swift Playgrounds中编写了一段代码,该代码可以计算周围新型冠状病毒接触确认应用程序(COCOA)安装在手机上的秒数。我还创建了iOS应用程序版本,但在iOS13以上版本中,COCOA无法被检测到。现在,我面临使用javascript编写类似功能的挑战。
我做了一个应用程序来调查新冠接触确认应用程序的使用情况。
快捷代码
import UIKit
import CoreBluetooth
import PlaygroundSupport
class ViewController: UIViewController, CBCentralManagerDelegate {
var centralManager: CBCentralManager?
let scanTime: Double = 10 // seconds
let label = UILabel()
var count = 0
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
label.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height/4)
label.center = view.center
label.textAlignment = .left
label.font = label.font.withSize(100)
label.text = "-"
self.view.addSubview(label)
centralManager = CBCentralManager(delegate: self, queue: nil)
}
func scanStart() {
if centralManager!.isScanning == false {
let service = CBUUID(string: "fd6f")
self.centralManager?.scanForPeripherals(withServices: [service], options: nil)
DispatchQueue.main.asyncAfter(deadline: .now() + scanTime) {
self.centralManager?.stopScan()
self.label.text = "\(self.count)"
self.count = 0
self.scanStart()
}
}
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
switch (central.state) {
case .poweredOn:
scanStart()
case .unknown:
break
case .resetting:
break
case .unsupported:
break
case .unauthorized:
break
case .poweredOff:
break
@unknown default:
break
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
print(peripheral.identifier)
count += 1
}
}
PlaygroundPage.current.liveView = ViewController()
macOS Catalina和iPadOS 12的Swift Playgrounds能够检测到COCOA,但是在macOS Monterey和iPadOS 13及更高版本中,无法再进行检测。
预先调查
-
- node.js v8の古いバージョンでは、nobleのモジュールを使った、BLEの事例があった。
-
- openSSLの脆弱性を考慮すると、新しいバージョンを使いたい。
-
- できるだけ新しいバージョンのnode.jsでBLEを使う時、アバンダンウェアプロジェクト (Abandonware) のnobleを使うらしい。
- node.jsの公式サイトには、ARMv6のバイナリがない。
环境
-
- Raspberry Pi Zero (CPU ARMv6)
-
- Raspberry Pi OS Lite 32bit January 28th 2022 (bullseye)
- node.js v17.7.2
安装Node.js
将环境变量添加到 ~ / .profile。
VERSION=v17.7.2
DISTRO=linux-armv6l
export PATH=/usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin:$PATH
通过更改”VERSION”来安装不同版本的nodejs。
将环境变量应用于。
. ~/.profile
由于Node.js官方网站没有ARMv6的二进制版本,因此需要从非官方构建网站进行下载。
curl -OL https://unofficial-builds.nodejs.org/download/release/$VERSION/node-$VERSION-$DISTRO.tar.gz
解压文件。
sudo mkdir -p /usr/local/lib/nodejs
sudo tar -zxvf node-v16.14.2-linux-armv6l.tar.gz -C /usr/local/lib/nodejs
我将创建一个符号链接。
sudo ln -s /usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin/node /usr/bin/node
sudo ln -s /usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin/npm /usr/bin/npm
sudo ln -s /usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin/npx /usr/bin/npx
确认
$ node -v
v17.7.2
$ npm -v
8.5.2
$ npx -v
8.5.2
$ node -p process.versions
{
node: '17.7.2',
v8: '9.6.180.15-node.15',
uv: '1.43.0',
zlib: '1.2.11',
brotli: '1.0.9',
ares: '1.18.1',
modules: '102',
nghttp2: '1.47.0',
napi: '8',
llhttp: '6.0.4',
openssl: '3.0.2+quic',
cldr: '40.0',
icu: '70.1',
tz: '2021a3',
unicode: '14.0',
ngtcp2: '0.1.0-DEV',
nghttp3: '0.1.0-DEV'
}
安装noble
npm i @abandonware/noble
示例代码
在10秒内,统计安装了周边新型冠状病毒接触追踪应用(COCOA)的设备数量。
// COCOA scan.js
'use strict';
const noble = require('@abandonware/noble');
const cocoaDevices = [];
//discovered BLE device
const discovered = (peripheral) => {
const device = {
uuid: peripheral.uuid,
rssi: peripheral.rssi
};
cocoaDevices.push(device);
console.log(`${cocoaDevices.length}:(${device.uuid}) RSSI${device.rssi}`);
}
//BLE scan start
const scanStart = () => {
//COCOA Service UUID
noble.startScanning(['fd6f'],false);
noble.on('discover', discovered);
}
if(noble.state === 'poweredOn'){
scanStart();
}else{
noble.on('stateChange', scanStart);
}
setTimeout(function(){
noble.stopScanning();
process.exit();
},10000);
执行结果
请参阅
以下是一个在2021年4月版本上使用Node.js搜索周围的BLE设备的示例。