awdl
v1.0.1
Published
Send data via Apple Wireless Direct Link (AWDL) using JavaScript.
Downloads
5
Maintainers
Readme
awdl
Send data via Apple Wireless Direct Link (AWDL) using JavaScript.
From the Open Wireless Link, an awesome project that seeks to reverse-engineer AWDL:
What is Apple Wireless Direct Link (AWDL)?
According to US patent 20180083858A1, AWDL was designed as a successor to the unsuccessful Wi-Fi IBSS a.k.a. ad hoc mode:
The limitations of IBSS mode (and its Wi-Fi infrastructure predecessors) led the Wi-Fi Alliance to define Wi-Fi Direct. Further, due to concerns regarding Wi-Fi Direct, Apple Wireless Direct Link (AWDL) was developed by Apple and eventually adopted by the Wi-Fi Alliance as the basis for Neighbor Awareness Networking (NAN).
Which services use AWDL?
We compiled a non-exhaustive list with applications which use [...] AWDL [...].
- AirDrop
- AirPlay
- Auto Unlock
- Universal Clipboard
How does AWDL work?
In technical terms, we found that AWDL works essentially works as follow:
In short, each AWDL node announces a sequence of Availability Windows (AWs) indicating its readiness to communicate with other AWDL nodes. An elected master node synchronizes these sequences. Outside the AWs, nodes can tune their Wi-Fi radio to a different channel to communicate with an access point, or could turn it off to save energy.
Installation
npm install awdl
Usage
This is a very low-level example, a more practical one will be added soon!
const {isSupported, listenOnAWDL} = require('awdl')
const {decode} = require('dns-packet')
if (isSupported()) {
// mDNS + DNS-SD over AWDL a.k.a. "iPhone magically find Mac with AirDrop"
const awdl = listenOnAWDL(5353, {udp: true, recvAnyif: true})
awdl.on('error', (err) => {
console.error(err)
process.exit(1)
})
awdl.on('data', (msg) => {
const {type, questions, answers} = decode(msg)
console.log(type, questions, answers)
})
}
API
listenOnAWDL(port, opt = {})
Returns a duplex stream.
opt
may have the following fields:
udp
– Use UDP instead of TCP? Default:false
readonly
– Disallow sending data? Will return a readable stream then. Default:false
recvAnyif
– setSO_RECV_ANYIF
to receive traffic from all network interfaces? Apple calls this "unrestricted inbound processing". Default:false
Contributing
If you have a question or need support using awdl
, please double-check your code and setup first. If you think you have found a bug or want to propose a feature, use the issues page.