sundway / blog

oh~~
110 stars 6 forks source link

在 IoT-X 创建你的 LoRa 网络 #11

Closed sundway closed 5 years ago

sundway commented 7 years ago

如果没有建立私人的 LoRa 网络,请先阅读 建立自己的私人 LoRa 网络

现在您已经设置了网关,可以到达互联网,现在该安装和配置 LoRa 数据包转发器了,这样就有一个发送 LoRa 数据包的地方了。

安装 LoRa 数据包转发器

LoRa 数据包转发器是一个在网关上运行的开源应用程序,将捕获的 LoRa 数据包转发到您选择的主机。 你可以安装数据包转发器并将其配置为将其数据发送到 IoT-X。

要安装数据包转发器,请按照以下说明进行操作:

Kerlink IoT station

Kerlink IoT 站随附安装的数据包转发器。 运行 ps | grep pkt 来验证它是否已经在运行。 您可以通过 find / -name global_conf.json 找到数据包转发器的位置。

MultiTech Conduit

按照本文档的步骤。

Raspberry Pi和IMST iC880A

配置LoRa数据包转发器

接下来,您需要一个数据包转发器的配置文件,您可以从IoT-X网站检索。

构建设备

现在开始有趣的工作:构建可以通过 LoRa 网络发送传感器数据的设备。 例如,您可以使用 PIR 传感器创建简单的运动传感器(在当地五金店不到10欧元,从中国订购时为2欧元)。 当然,您可以使用任何其他传感器。

一些关于写固件的笔记

不断发送数据

由于占空比限制,您不能持续发送数据。这是使用开放频谱的要求。如果发送太快,发送将失败。允许发送的速度取决于你使用的扩展因子。使用更高的扩展因子,发送消息需要更长的时间 - 尽管网关将收到它的机会增加。因此,你需要等待更久才能再次发送。在开发过程中,可以将扩展因子设置为 SF7(最低),因此可以每6-7秒发送一次。

LoRaWAN 具有称为自适应数据等级(ADR)的功能,网络可以通过该功能来控制扩展因子。你可能希望启用此功能。

阻塞管脚

LoRa 屏蔽的一个缺点是它会阻塞所有引脚。你可以在屏蔽背面焊接一些新的接头,以添加新的外围设备,或者使用像 nRF51-DK 这样的微控制器,其引脚可用两次,一次通孔连接器,一次通过母头。

在 IoT-X 上注册设备

LoRa 是端对端加密的,带有两组密钥。你需要将这些密钥和设备 ID 编程到设备固件中。将使用这些密钥签署邮件,并由网络服务器进行验证。

生成新的密钥对:

现在你有 keys,可以开始编写软件。

注意:确保你在在线编译器的右上角选择了正确的开发板。

使用 LoRa 屏蔽

将样板程序导入在线 IDE

注意:确保您在在线编译器的右上角选择了正确的板。

设置屏蔽频率

你需要为你拥有的屏蔽版本(以及您在世界各地)设置正确的频率。 打开 LMiC / lmic.h,找到以下几行:

// mbed compiler options
//#define CFG_eu868
#define CFG_us915 

确保正确的行被取消注释,具体取决于您拥有的屏蔽版本。

如果你有 SX1276MB1LAS:

//#define CFG_eu868
#define CFG_us915 

如果你没有 SX1276MB1LAS:

#define CFG_eu868
//#define CFG_us915

添加 IoT-X keys

现在,将密钥从 IoT-X 编程到设备固件中。 你将需要“应用程序”页面和“设备”页面上的键。

打开 main.cpp,并将 OVER_THE_AIR_ACTIVATION 设置为1:

#define OVER_THE_AIR_ACTIVATION

然后,更改以下行:

// application router ID (LSBF)
static const uint8_t AppEui[8] =
{
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

// unique device ID (LSBF)
static const u1_t DevEui[8] =
{
    0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
};

// device-specific AES key (derived from device EUI)
static const uint8_t DevKey[16] =
{
    0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
    0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
};

注意:将它们变成十六进制数字。 例如,5ADA30AA 的密钥在你的代码中应该是 0x5A,0xDA,0x30,0xAA。

验证设置

现在您可以通过单击“编译”按钮来验证设置是否有效。

当编译成功时,下载一个文件。

将开发板插入计算机(通过micro-USB)将其作为 USB 大容量存储设备进行安装。 在大多数情况下,你不需要驱动程序,但你可以在此找到驱动程序,以防万一。

设备挂载后,将编译的文件拖到板上。 这将导致设备启动。 然后,你可以看到进入 IoT-X 应用程序页面的消息:

切换到手动发送

默认情况下,应用程序会自动发送数据。 如果要更改此操作,请从 main.cpp 中删除这些行:

if( txOn == true )
{
    //Sends frame every APP_TX_DUTYCYCLE +/- APP_TX_DUTYCYCLE_RND random time (if not duty cycle limited)
    os_setTimedCallback( &sendFrameJob,
                         os_getTime( ) + ms2osticks( APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND ) ),
                         onSendFrame );

    ////Sends frame as soon as possible (duty cycle limitations)
    //onSendFrame( NULL );
}

现在,你可以随时添加发送消息的代码,例如当有人在 PIR 传感器前移动时中断触发。 例如

InterruptIn pir(D5);

static void prepareTxFrame( void )
{
    LMIC.frame[0] = pir; // current state of the pir sensor
#if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
    LMIC.frame[1] = LMIC.seqnoDn >> 8;
    LMIC.frame[2] = LMIC.seqnoDn;
    LMIC.frame[3] = LMIC.rssi >> 8;
    LMIC.frame[4] = LMIC.rssi;
    LMIC.frame[5] = LMIC.snr;
#endif
}

void movement() {
    onSendFrame(NULL);
}

void no_movement() {
    onSendFrame(NULL);
}

int main( void ) {

    pir.rise(movement);
    pir.fall(no_movement);

    // ... lora related things
}

更改 prepareTxFrame 函数的内容以更改你要发送的数据(也更新 LORAWAN_APP_DATA_SIZE)。现在,只要 PIR 传感器改变状态(从运动到不运动,而另一方面),你将会收到一条消息。

使用 MultiTech mDot

将样板程序导入在线 IDE

注意:确保您选择编译器右上角的正确板。

添加IoT-X键

现在,将密钥从 IoT-X 编程到设备固件中。 你将需要“应用程序”页面和“设备”页面上的键。打开

示例 \src\ota_example.cpp.cpp,并更改以下代码。

static uint8_t network_id[] = { 0x6C, 0x4E, 0xEF, 0x66, 0xF4, 0x79, 0x86, 0xA6 };
static uint8_t network_key[] = { 0x1F, 0x33, 0xA1, 0x70, 0xA5, 0xF1, 0xFD, 0xA0, 0xAB, 0x69, 0x7A, 0xAE, 0x2B, 0x95, 0x91, 0x6B };
static uint8_t frequency_sub_band = 0;
static bool public_network = false;

注意:将它们变成十六进制数字。 例如,5ADA30AA 的密钥在你的代码中应该是0x5A,0xDA,0x30,0xAA。

另外,将

update_ota_config_name_phrase(network_name, network_passphrase, frequency_sub_band, public_network, ack);
// update_ota_config_id_key(network_id, network_key, frequency_sub_band, public_network, ack);

改为:

// update_ota_config_name_phrase(network_name, network_passphrase, frequency_sub_band, public_network, ack);
update_ota_config_id_key(network_id, network_key, frequency_sub_band, public_network, ack);

验证设置

现在您可以通过单击“编译”按钮来验证设置是否有效。

当编译成功时,下载一个文件。

将开发板插入计算机(通过micro-USB)将其作为 USB 大容量存储设备进行安装。 在大多数情况下,您不需要驱动程序,但您可以在此找到驱动程序,以防万一。

设备挂载后,将编译的文件拖到板上,将启动设备。然后,你可以看到进入 IoT-X 应用程序页面的消息:

切换到手动发送

默认情况下,应用程序会自动发送数据。 如果要更改,可以更 sleep_wake_rtc_or_interrupt(); 调用,并将其替换为sleep_wake_interrupt_only();. 然后发送只有当您将唤醒针拉高时才会发生。

使用 MQTT 上的数据

现在,网络的前三部分正在运行,现在是在一个小应用中使用传感器数据的时候了。要从 IoT-X 网络中检索数据,它们提供了一个 MQTT 服务器。 MQTT 是一个支持良好的轻量级消息传递协议,大多数编程语言提供了一个 MQTT 客户端库。您可以编写一个 node.js 应用程序,该应用程序在检测到移动时告诉你。通过检查 LoRa有 效负载的第一个字节(1 =运动,0 =无运动)来执行此操作。

创建MQTT用户

创建一个 node.js 应用程序

现在可以使用任何MQTT客户端连接到IoT-X MQTT服务器。这是node.js中的一个例子。

var mqtt = require(‘mqtt’);
var client = mqtt.connect(‘mqtts://lora-eu.iot-x.com’, {
username: ‘YOUR_USERNAME’,
password: ‘YOUR_PASSWORD’
});
client.on(‘connect’, function () {
console.log(‘Connected to Stream MQTT’);
client.subscribe(‘/lora/+/message’);
});
client.on(‘message’, function (topic, message) {
var deveui = (topic.split(‘/’).filter(f=>!!f)[1]).toUpperCase();
message = JSON.parse(message);

if (!message.gateway_info) {
    /* downlink */
    return;
}

var buffer = [].slice.call(Buffer.from(message.data, 'base64'));
if (buffer[0] === 1) {
    console.log('Movement detected (' + deveui + ')');
}
else {
    console.log('No movement detected (' + deveui + ')');
}
});
client.on(‘error’, err => console.error(‘Stream MQTT error…’, err));

注意:使用您在上一节中创建的 MQTT 凭据替换 YOUR_USERNAME 和 YOUR_PASSWORD。

你现在拥有一个功能齐全的 LoRa 网络,其中包含设备,网关和应用程序。

结论

LoRa 是一项具有很大潜力的优秀技术,特别是因为任何人都可以建立网络,并开始建立投影相对较小的远程 IoT 设备。 我们希望本指南帮助你开始使用,我们很乐意看到你使用 LoRa 和 ARM mbed 制作的产品!