我已经实现了BLE广告在Ubuntu 14.04.1上发送数据包的实用程序。当我从sudo命令行运行它时,它的工作非常完美。我想在系统启动时运行我的实用程序,因此我已将其调用添加到/etc/rc.local。重新启动后,我的实用程序失败,错误"错误hci_send_cmd:操作不允许" 代码:
static void set_adv_payload(int dev_num, void * _buf, int _len)
{
struct hci_filter flt;
int dd;
uint16_t ocf;
uint8_t ogf;
int err;
DBG("set_adv_payload buf[0]=%02X, len=%d", *(unsigned char*)_buf, _len);
dd = hci_open_dev(dev_num);
if (dd < 0) {
DBG("Error hci_open_dev %d", dev_num);
return ;
}
hci_filter_clear(&flt);
hci_filter_set_ptype(HCI_EVENT_PKT, &flt);
hci_filter_all_events(&flt);
if (setsockopt(dd, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0) {
DBG("Error setsockopt");
hci_close_dev(dd);
return;
}
ogf = 0x8;
ocf = 0x8;
if(hci_send_cmd(dd, ogf, ocf, _len, _buf) < 0)
{
DBG("Error hci_send_cmd %s", strerror(errno));
}
hci_close_dev(dd);
}
我无法理解从命令行运行此代码与sudo和从/etc/rc.local运行之间的区别是什么,因为两者都以root权限运行。
user@dev-ws12-ubuntu:~$ ps -aux | grep leadv
root 979 0.0 0.0 4352 748 ? S 17:11 0:00 /usr/sbin/leadv