awdl
v1.0.1
Published
Send data via Apple Wireless Direct Link (AWDL) using JavaScript.
Downloads
11
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.