统计安装了新冠病毒接触追踪应用程序(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);

执行结果

スクリーンショット 2022-03-26 17.55.33.png

请参阅

以下是一个在2021年4月版本上使用Node.js搜索周围的BLE设备的示例。

广告
将在 10 秒后关闭
bannerAds