我试图将Arduino连接到WiFi网络。
df <- data.frame(ID=c(202L,202L,202L,202L,203L,203L,203L,203L,204L,204L),X1=c(1L,2L,3L,4L,1L,2L,3L,4L,2L,4L),X2=c(0L,0L,0L,4L,0L,2L,0L,0L,0L,4L),X3=c(895,130,364,104,895,950,3.4,868,801,205),X4=c(114L,399L,112L,12L,112L,815L,156L,25L,398L,0L),X5=c(17L,74L,48L,83L,76L,32L,69L,71L,51L,14L),X6=c(21L,19L,12L,81L,49L,35L,14L,20L,44L,24L),X7=c(1L,4L,5L,0L,1L,4L,5L,0L,4L,0L),X8=c(4L,4L,4L,4L,5L,5L,5L,5L,8L,8L));
res <- merge(subset(df[c('ID','X2')],X2!=0L),reshape(df,dir='w',idvar=c('ID','X8'),timevar='X1',drop='X2',sep='_'));
res[is.na(res)] <- 999L;
res;
## ID X2 X8 X3_1 X4_1 X5_1 X6_1 X7_1 X3_2 X4_2 X5_2 X6_2 X7_2 X3_3 X4_3 X5_3 X6_3 X7_3 X3_4 X4_4 X5_4 X6_4 X7_4
## 1 202 4 4 895 114 17 21 1 130 399 74 19 4 364.0 112 48 12 5 104 12 83 81 0
## 2 203 2 5 895 112 76 49 1 950 815 32 35 4 3.4 156 69 14 5 868 25 71 20 0
## 3 204 4 8 999 999 999 999 999 801 398 51 44 4 999.0 999 999 999 999 205 0 14 24 0
问题是,在密码短语中某处有代码0x00。由于begin()方法接受参数char,它是以空字符结尾的字符串,因此 password 被截断。 有办法解决这个问题吗?我在哪里可以找到修改它的begin()方法的来源?
编辑:错误。 它不是密码短语,它是带有64个十六进制字符的PSK,并且它不想连接。
更新: 我解决了这个问题。我不是PSK问题,但WiFi路由器高级设置。什么时候
54g™模式设置为 54g性能,它不想连接。将其更改为 54g Auto 后,它可以正常工作。
答案 0 :(得分:3)
我对Arduino一无所知 - 但更多关于802.11 aka Wi-Fi。如此:
不要这样做。如果你的密码中间有一个0x00,那么根据IEEE 802.11标准,它在技术上是无效的。
我认为,如果正确实施,你将被解释为你的密码短语的最后一个字符(=密码短语是之前 这个0x00之前的所有) ;重新寻找未定义的行为 - 充其量,互操作性问题,最糟糕的是,你正在下注。
怎么样?
(警告:这将是无聊的,很多&#34;网络律师&#34;东西)
与此相关的IEEE 802.11标准是IEEE Std 802.11i-2004&#34;修订6:媒体访问控制(MAC)安全增强&#34; [0],又名&#34; WPA2&#34;。< / p>
(我不会深入挖掘WEP,这显然已被弃用,没有用,也没有&#34;基本&#34; WPA,这是一个等待此WPA2标准完成的转换。) / p>
相关部分可以在802.11i中找到,ASN MIB [1](附录D,规范性),第136页,定义&#34; dot11RSNAConfigPSKPassPhrase
&#34;作为&#34; DisplayString
&#34;。那么什么类型的数据恰好是&#34; DisplayString
&#34;?
RFC 1213,&#34;基于TCP / IP的互联网网络管理管理信息库:MIB-II&#34;,1991年,第3页,声明:
&#34; DisplayString仅限于NVT ASCII字符集,如 在[6]的第10-11页中定义。&#34;
行...
这&#34; [6]&#34;从1983年开始是RFC 854(哇!这些IETF和IEEE认真设计他们的标准,真的,真的构建)。你还跟着我吗? :-)所以看看它我们知道NVT代表&#34;网络虚拟终端&#34;,并指向第10和11页,我们发现:
NVT打印机[原文如此!记住1983年的[...]可以产生 代表所有95个USASCII图形(代码32到126)。
好,ASCII代码32到126。现在让我们回到IEEE 802.11i:
在附件H(资料性)中,&#34; RSNA参考实现和测试向量&#34;,部分&#34; H.4建议的密码短语到PSK映射&#34; (请记住,使用SSID进行数学分析的密码短语的目的是导出PSK(预共享密钥),对于802.11操作更有用,但用户友好程度远低于我能说的简单密码短语。键入一个该死的键盘&#34;)。其中,用IEEE的方式,给出了这个(第165页):
RSNA PSK由256位或64字节组成 十六进制。用户很难正确输入64个十六进制字符。 但是,大多数用户都熟悉密码和密码短语 进入它们比进入按键更舒服。用户更多 甚至可能能够输入ASCII密码或密码短语 虽然这样做会限制可能的密钥集。这表明 可以做的最好的事情是向PSK引入密码短语 映射。
此子句定义了一个pass-phrase-to-PSK映射 与RSNA一起使用的推荐做法。
这个密码短语映射是为了鼓励用户不熟悉而引入的 使用加密概念来启用其安全功能 WLAN。
......那么密码短语的目的是什么?接下来是第166页:
此处,以下假设适用:
- 密码短语是一个介于8到63个ASCII编码字符之间的序列。 63的限制来自于区分的愿望 密码和PSK之间显示为64十六进制
字符。- 密码短语中的每个字符必须具有32到126(十进制)范围内的编码。 [强调我的]
而且瞧!实际上,&#34; 32到126(十进制),包括&#34;。
所以这里我们再次使用密码作为ASCII&#34;在32到126(十进制)&#34;的范围内,从IEEE到IETF确认回IEEE。我们还知道它应该在8到63个字节之间,我推断,这意味着如果超过63个字节,它将被削减(并且不会终止NULL,这不是问题),如果更短,将在32-126 ASCII码之外的第一个字符处剪切。当然,C字符串NULL终结符0x00对于此BTW来说更实用,更明智。
因此,passphrase =一个仅包含32到126(十进制)ASCII码的字符串。
看一下ASCII表格,你会看到这个以空格开头,并以波浪号结束&#39;〜&#39;。
并且肯定不是0x00。
因此,长话短说:您的密码在标准方面是技术上无效的,并且您正在寻找未定义的行为。
恭喜你,如果你已经读过这篇文章了!
<强>附录:强>
当谈到网络协议时,永远不要假设看起来像#34;字符串&#34;只是&#34;一个字符串&#34;从你可能预设的任何东西,并始终检查确切的编码/限制。
关于Wi-Fi的其他示例:
另一个&#34;字符串&#34;是SSID。这真的是一个字符串吗? No。它是一个32字节的原始数组,没有ASCII,没有UTF-8,Unicode,无论如何,没有终止,只有32个原始字节,即使你设置它&#34;作为&#34; foobar + NULL终止符&#34;堆栈将使用整个32字节并继续播放(查看wireshark跟踪,并在解剖中双击SSID字段:32字节长)。因此,SSID可能只包含ASCII空格,制表符,CR,LF和一些0x00,或者只有0x00 BTW,它将完全有效并且无论如何都要管理为完整的32字节序列。
修改强>
我想知道你设置这样一个密码短语的动机,以及我能提出的唯一想法 - 如果我错了,纠正我 - 是你的目的是为了确保普通用户发挥巧妙的作用使用常规键盘,永远不会输入密码。可悲的是 - 或者实际上希望 - 正如我所解释的那样,这是行不通的,因为 IEEE精确地设计密码短语数据类型是100%确定任何人,使用最基本的键盘,总是可以输入它。那是他们的动机。
所以,你能做什么?
作为替代方案,您可以直接使用PSK。这是普通的原始32字节(表示64位十六进制数字ASCII),没有可类型/可打印的考虑因素。例如,来自hostapd.conf文件(当然,示例PSK在此处表示为&#34; text&#34;,但实际上是原始字节):
# WPA pre-shared keys for WPA-PSK. This can be either entered as a 256-bit
# secret in hex format (64 hex digits), wpa_psk, or as an ASCII passphrase
# (8..63 characters) that will be converted to PSK. This conversion uses SSID
# so the PSK changes when ASCII passphrase is used and the SSID is changed.
# wpa_psk (dot11RSNAConfigPSKValue)
# wpa_passphrase (dot11RSNAConfigPSKPassPhrase)
#wpa_psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
#wpa_passphrase=secret passphrase
但当然,1 /这可能不适合您的用例(部署明智),2 / Arduino Wi-Fi API可能没有这样的功能。
希望得到这个帮助。
[0]: 你可以在这里免费下载: http://standards.ieee.org/getieee802/download/802.11i-2004.pdf
[1]: 这是&#34;管理信息库&#34;的IEEE术语。 in&#34;抽象语法表示法&#34;,它是每个数据的正式分层表示法,其中包含给定标准的名称和类型。您可以将其视为&#34; XML&#34;,仅将其不是 XML,并由IETF和IEEE(RFC 2578,RFC 1213)使用。