awdl
v1.0.1
Published
Send data via Apple Wireless Direct Link (AWDL) using JavaScript.
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 awdlUsage
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:falsereadonly– Disallow sending data? Will return a readable stream then. Default:falserecvAnyif– setSO_RECV_ANYIFto 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.
