Comments (29)
I don't know but i opened a issue on mmdvmhost to find out
from ok-dmrlib.
Hi @LaneaLucy can you please clarify what type of terminals (aka mobile stations, handheld dmr radio, car/vehicle dmr radio, ...) you want to use? Or if you intend to just use the MMDVM/DMR protocols to transfer arbitrary data over MMDVM master (hblink, freedmr, ...) without terminals?
There is sadly no easy and generic way of using the terminals, which is the reason why there are no ready-made examples for such, because usually the protocols implemented in ok-dmrlib are encapsulated by proprietary protocols (of talking to terminals or using their serial interface for the matter)
Best of luck with your endeavours
from ok-dmrlib.
I just want to be able to send data over RF. This could be from one mmdvm directly to another mmdvm, or it could be mmdvm <---RF---> mmdvm <---network---> dmr server <---network---> mmdvm <---RF---> mmdvm
Or anything in between.
The important part is rf
from ok-dmrlib.
not sure what you mean by "mmdvm", in my post i talk about software endpoint implementing Homebrew/MMDVM protocol (by G4KLX and friends).
If you need to pass the data over RF, it must be valid data transmission including header and terminator
I'd suggest you start your study in TransmissionGenerator
and respective tests
Which allows you to generate all bursts necessary to transmit arbitrary data
from ok-dmrlib.
Could you maybe make a small example which uses a mmdvm hotspot to send hello world to another mmdvm hotspot?
Just a small cli program where you can use --tx as argument for the sender how then sends every 3 seconds a hello world message with a increasing counter, like "hello world 1", "hello world 2", ... And with --rx as argument which just receives those hello world messages and prints them to the console.
I bet this would help many people who would like to use this lib
from ok-dmrlib.
Yeah, that wont happen any time soon sorry, i am overloaded. I'll appreciate anything from community, even PoC, i could later clean up and publish.
from ok-dmrlib.
I really need a example how to send for example "hello world" via mmdvm hardware and receive it via mmdvm hardware too.
It can't be that there is no documented library to just send some generic stuff over dmr.
Even with some dmr server in-between mmdvm hardware + mmdvmhost and the example software I would be ok.
But I just need a simple example code.
Anyone can help me with it please?
What about help for a little donation?
from ok-dmrlib.
tl;dr: i'm not sure what kind of "simple example code" could be produced, i never worked low-level with mmdvmhost, maybe if it has CLI interface or something, it could be easier than what I describe below
If it's meant to include on-air transmission, you'll want similar setup
[homebrew client] -> hblink3 -> mmdvmhost -> (air) -> mmdvmhost/radio
Question is what type of protocol you'll use to transfer data, i'd suggest usual Rate 1, 1/2 or 3/4 data transmission.
This kind of transmission might not be visible on radio, but will be delivered over air and you can log/decode it
If you check out the sample bursts needed to deliver SMS here:
There are preambles (might not be needed, usually to clear out traffic and let the radio-hw sync on RX
And bursts after preambles, incl. header, decoded:
> dmrlib-dmr-burst 7abc3520240678e3a3436a8b55bdff57d75df5d55ed179b2304122624d0589a7bc
7abc3520240678e3a3436a8b55bdff57d75df5d55ed179b2304122624d0589a7bc
[BsSourcedData] [DataTypes.DataHeader] [CC: 5]
[DataPacketFormats.DataPacketUnconfirmed] [SAPIdentifier.UDP_IP_compression] [TARGET IS INDIVIDUAL] [PAD OCTETS: 10] [SOURCE: 2308094] [DESTINATION: 2308092] [FullMessageFlag.FirstTryToCompletePacket] [BTF: 2] [FSN: Unconfirmed data single fragment]
> dmrlib-dmr-burst 430d22106233407c00b0219a55ddff57d75df5d6f1492a46d43d20c20b8291214b
430d22106233407c00b0219a55ddff57d75df5d6f1492a46d43d20c20b8291214b
[BsSourcedData] [DataTypes.Rate12Data] [CC: 5]
[RATE 1/2 DATA UNCONFIRMED] [DATA(12) d6790062620003bf00070000]
> dmrlib-dmr-burst 008a00da01b401400330180015ddff57d75df5d6f104025802700ae0250010001e
008a00da01b401400330180015ddff57d75df5d6f104025802700ae0250010001e
[BsSourcedData] [DataTypes.Rate12Data] [CC: 5]
[RATE 1/2 DATA UNCONFIRMED] [DATA(12) 0000000000000000210b9a3d]
In this specific case it carries UDP/IP compressed header and payload (Motorola TMS - Text Messaging Service - Acknowledgment with seq.no. 7)
> dmrlib-dmr-ipudp d6790062620003bf00070000
d6790062620003bf00070000
[IPv4 id: 54905] [IP src: IPAddressIdentifier.RadioNetwork] [IP dst: IPAddressIdentifier.RadioNetwork] [UDP src: UDPPortIdentifier.ManufacturerSpecific (98)] [UDP dst: UDPPortIdentifier.ManufacturerSpecific (98)] [DATA: 0003bf00070000]
> debug-motorola-tmp 0003bf0007
{'_m_custom_pdu_type': 31,
'len_address': 0,
'message_header': {'acknowledgement_required': False,
'control_user_bit': True,
'extension_bit': True,
'pdu_type': 15,
'reserved': True},
'message_size': 3,
'pdu_content': {'tms_acknowledgement_header_sequence_number': {'has_msb_header': False,
'header_lsb_bits': 7,
'header_lsb_reserved': 0}},
'unparsed_data': b''}
So with the setup i outlined in the beginning, you will need to
- establish mmdvm/homebrew protocol link with hblink3 (or similar mmdvm hub)
- generate transmission bursts and send them over wrapped within MMDVM DMRD pdus, see https://github.com/OK-DMR/DMR-HAM-Protocols/blob/master/homebrew-2015.md#210-dmr-data-dmrd
- receive bursts on the other end and extract data
Or if you talk about using DMO (Direct Mode Operation), eg. without repeater infrastructure, you could even connect two radios (or maybe two mmdvm modems, i never tried that) to single computer. However then you'd talk to the radio using Motorola/Hytera/other proprietary protocol, MMDVM has no support in hardware afaik.
from ok-dmrlib.
@smarek Do you have more such samples
like - 7abc3520240678e3a3436a8b55bdff57d75df5d55ed179b2304122624d0589a7bc
For all the Data PDU's
from ok-dmrlib.
@smarek could you please make a complete example out of it?
Just a Python program that connects to hblink3 and then sends "hello world" and receives it again.
I just need a complete example application to send hello world and receives it again, maybe with src and dst dmr id as input? Don't need to be a argument, some global variables inside the code would be enough for the beginning.
Then I just need to figure out how to link 2 hblink3 over the air
from ok-dmrlib.
@smarek Looking for your help on the above comments
from ok-dmrlib.
@LaneaLucy i can do that, however i don't have much time to invest right now, if you're in hurry, try to work out something, it's always easier for me to help with something existing than making everything from scratch on my own :)
@alwinhb i don't have anything extracted at the moment, you should really try to work with the PCAP data i already linked you and extract the right bursts, the tools are available (ok-dmrlib and dmr-kaitai cli scripts) if they need enhancement, you can try to modify PcapTool or any other, or at least identify "the way i want to use the script and it's not provided". I won't do your work on your behalf, not for free, sorry
from ok-dmrlib.
@smarek i can wait for now, but i really need at least a hello world example of doing just through a dmr server and through mmdvm hardware modems. If i have those for examples (one transmit, one receive, over server and over mmdvm) i can mix them together as i need them and replace the hello world message with my own stuff.
Is there a site where i can for example buy you a coffee?
from ok-dmrlib.
@LaneaLucy thank you for the offer, i have github sponsors set-up for a while now https://github.com/sponsors/smarek
however buymeacoffee.com works for me as well, let me know if you have preference (or will use github sponsors) and i can make myself available on some platform of your choice, or i'll let you know my BIC/IBAN in private if you want to skip the middle men
from ok-dmrlib.
@smarek send you some over GitHub sponsor, i hope this is enough for the beginning.
What do you mean with platform? Do you mean sponsor/donation platform or something with the library?
from ok-dmrlib.
meant sponsor/donation platform, i actually was curious, so now i'm also on https://www.buymeacoffee.com/smarek
anyway, yep, i'll give it some time
actually you only will need single hblink3, because your network model will be: "recipient" and "sender" will be homebrew protocol endpoints emulating dmr terminal(s)
from ok-dmrlib.
So if i understand right, for a standalone rf node i need a local dmr server in the middle for mmdvm to connect to?
from ok-dmrlib.
@smarek Thanks for the quick help, Not looking for the quick help, Whenever you get time you may add the hex samples (Data and Voice)
from ok-dmrlib.
@alwinhb suit yourself, i updated pcaptool to output both description of processed burst and hex form of on-air burst (not raw input wrapped in IPSC/MMDVM/whatever protocol), now you should be able to inspect all the pcap data easily
usage:
> dmrlib-pcap-tool --observe-transmissions HYTERA_IPSC/gw_hytera_mmdvm_2_start_voice_voice_close.pcapng
--output truncated--
[BsSourcedData] [DataTypes.VoiceLCHeader] [CC: 1]
[FLCOs.GroupVoiceChannelUser] [FeatureSetIDs.StandardizedFID] [SOURCE: 2308155] [GROUP: 111] [SERVICE_OPTIONS: PRIORITY:0]
06e50ae604f020e84af05600046dff57d75df5de32b008303e4038002d813f8317
[BsSourcedVoice] [VoiceBursts.VoiceBurstA]
e96180454a7ef78accec2c87277755fd7df75f76d8988caade0d842771d99d8a88
[BsSourcedVoice] [VoiceBursts.VoiceBurstA]
e96180454a7ef78accec2c87277755fd7df75f76d8988caade0d842771d99d8a88
[EmbeddedSignalling] [VoiceBursts.VoiceBurstB][LCSS.FirstFragmentLC] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
ed0ce6210f24786086ce2f867621309000c0c910ed9ccaaaff3ce4704f554824c0
[EmbeddedSignalling] [VoiceBursts.VoiceBurstC][LCSS.FirstFragmentLC] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
ed0ce6210f24786086ce2f867621309000c0c910ed9ccaaaff3ce4704f554824c0
[EmbeddedSignalling] [VoiceBursts.VoiceBurstD][LCSS.ContinuationFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
b6a3a3216944e4e20856fb86da1170a0a06057418dceec2ec6e3a2ea07ef0d4086
[EmbeddedSignalling] [VoiceBursts.VoiceBurstE][LCSS.ContinuationFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
b6a3a3216944e4e20856fb86da1170a0a06057418dceec2ec6e3a2ea07ef0d4086
[EmbeddedSignalling] [VoiceBursts.VoiceBurstF][LCSS.ContinuationFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
9693a3231962d5c20cc1aec0341170f121b097438c2980e6ef3da5553788adcaaa
[EmbeddedSignalling] [VoiceBursts.VoiceBurstA][LCSS.ContinuationFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
9693a3231962d5c20cc1aec0341170f121b097438c2980e6ef3da5553788adcaaa
[EmbeddedSignalling] [VoiceBursts.VoiceBurstB][LCSS.LastFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
a8b2c1314396988aeafc3e7eef615110c170f075959924ea3ab8d9b7706a9ca2e0
[EmbeddedSignalling] [VoiceBursts.VoiceBurstC][LCSS.LastFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
a8b2c1314396988aeafc3e7eef615110c170f075959924ea3ab8d9b7706a9ca2e0
[EmbeddedSignalling] [VoiceBursts.VoiceBurstD][LCSS.SingleFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
8949e623042e2dc0aebe6cc2034119c3d1642e25e67a8846ad7ce03767a21daa26
[EmbeddedSignalling] [VoiceBursts.VoiceBurstE][LCSS.SingleFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
8949e623042e2dc0aebe6cc2034119c3d1642e25e67a8846ad7ce03767a21daa26
[BsSourcedVoice] [VoiceBursts.VoiceBurstA]
b969e760023e1dc2e83255ce5d0755fd7df75f766c5a08acab49c613275f38a2ca
[BsSourcedVoice] [VoiceBursts.VoiceBurstA]
b969e760023e1dc2e83255ce5d0755fd7df75f766c5a08acab49c613275f38a2ca
[EmbeddedSignalling] [VoiceBursts.VoiceBurstB][LCSS.FirstFragmentLC] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
2144ee1b527e1c2cccb959c537613211400179117a6b82ac88027fa907d2a18e4e
[EmbeddedSignalling] [VoiceBursts.VoiceBurstC][LCSS.FirstFragmentLC] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
2144ee1b527e1c2cccb959c537613211400179117a6b82ac88027fa907d2a18e4e
[EmbeddedSignalling] [VoiceBursts.VoiceBurstD][LCSS.ContinuationFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
c8370a934797a32062e528813031703c3410a7442a4064cea16d1ada46f0e0c2cc
[EmbeddedSignalling] [VoiceBursts.VoiceBurstE][LCSS.ContinuationFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
c8370a934797a32062e528813031703c3410a7442a4064cea16d1ada46f0e0c2cc
[EmbeddedSignalling] [VoiceBursts.VoiceBurstF][LCSS.ContinuationFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
ae256aba653be486a0ff55e610017480066a37460a316a28ca73c17021d60022c2
[EmbeddedSignalling] [VoiceBursts.VoiceBurstA][LCSS.ContinuationFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
ae256aba653be486a0ff55e610017480066a37460a316a28ca73c17021d60022c2
[EmbeddedSignalling] [VoiceBursts.VoiceBurstB][LCSS.LastFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
bb6ac705433d6b80eebba2c25771509bb1b8d071b2a88c88cc65e553627f416e0e
[EmbeddedSignalling] [VoiceBursts.VoiceBurstC][LCSS.LastFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
bb6ac705433d6b80eebba2c25771509bb1b8d071b2a88c88cc65e553627f416e0e
[EmbeddedSignalling] [VoiceBursts.VoiceBurstD][LCSS.SingleFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
87da81261118ad88c4fb611aab4119c3d1642e25da238ec0cf326dd258e246c6e6
[EmbeddedSignalling] [VoiceBursts.VoiceBurstE][LCSS.SingleFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
87da81261118ad88c4fb611aab4119c3d1642e25da238ec0cf326dd258e246c6e6
[BsSourcedVoice] [VoiceBursts.VoiceBurstA]
e80118f3ed59bbc4e0ab2d548a7755fd7df75f78352584eeef6815c86da287cca8
[BsSourcedVoice] [VoiceBursts.VoiceBurstA]
e80118f3ed59bbc4e0ab2d548a7755fd7df75f78352584eeef6815c86da287cca8
[EmbeddedSignalling] [VoiceBursts.VoiceBurstB][LCSS.FirstFragmentLC] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
fd40535bc6a86b4a00ae776650b1309000c0c91d348c28048c664714ad05ce0826
[EmbeddedSignalling] [VoiceBursts.VoiceBurstC][LCSS.FirstFragmentLC] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
fd40535bc6a86b4a00ae776650b1309000c0c91d348c28048c664714ad05ce0826
[EmbeddedSignalling] [VoiceBursts.VoiceBurstD][LCSS.ContinuationFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
ad7444149e56cc2c048c452756f170a0a0605740de48a22a8e762472a1fa58a468
[EmbeddedSignalling] [VoiceBursts.VoiceBurstE][LCSS.ContinuationFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
ad7444149e56cc2c048c452756f170a0a0605740de48a22a8e762472a1fa58a468
[EmbeddedSignalling] [VoiceBursts.VoiceBurstF][LCSS.ContinuationFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
bf644436ec508c2e26ef274170c170f121b0974784fcc0a6f9204670861d88ae28
[EmbeddedSignalling] [VoiceBursts.VoiceBurstA][LCSS.ContinuationFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
bf644436ec508c2e26ef274170c170f121b0974784fcc0a6f9204670861d88ae28
[EmbeddedSignalling] [VoiceBursts.VoiceBurstB][LCSS.LastFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
ca1467124ae5e44eeada356663515110c170f07ba78468aefe0037e951d9cce222
[EmbeddedSignalling] [VoiceBursts.VoiceBurstC][LCSS.LastFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
ca1467124ae5e44eeada356663515110c170f07ba78468aefe0037e951d9cce222
[EmbeddedSignalling] [VoiceBursts.VoiceBurstD][LCSS.SingleFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
fa360bc141b5e5044499666ca25119c3d1642e27ef0140eaab116f8862c5d5ee6c
[EmbeddedSignalling] [VoiceBursts.VoiceBurstE][LCSS.SingleFragmentLCorCSBK] [PreemptionPowerIndicator.CarriesSameChannelOrNullEmbeddedMessage] [CC: 1]
fa360bc141b5e5044499666ca25119c3d1642e27ef0140eaab116f8862c5d5ee6c
[BsSourcedVoice] [VoiceBursts.VoiceBurstA]
ab136dab46c796ce4eed0ca4015755fd7df75f70ffed88cc9c5dc16174966b8802
--output truncated--
And you can reverse inspect operation by going
> dmrlib-dmr-burst 068a0a32044020904a8056a004adff57d75df5d967a40b08392034402581268324
068a0a32044020904a8056a004adff57d75df5d967a40b08392034402581268324
[BsSourcedData] [DataTypes.TerminatorWithLC] [CC: 1]
[FLCOs.GroupVoiceChannelUser] [FeatureSetIDs.StandardizedFID] [SOURCE: 2308155] [GROUP: 111] [SERVICE_OPTIONS: PRIORITY:0]
from ok-dmrlib.
So if i understand right, for a standalone rf node i need a local dmr server in the middle for mmdvm to connect to?
depends on the "standalone rf node" capability, if it's standalone hytera/motorola/... repeater, you don't need anything else, but you'll have to talk to it in proprietary language
if it's mmdvmhost , afaik it expects some kind of upstream (mmdvm dmr server or dmrgateway or alike)
from ok-dmrlib.
if it's mmdvmhost , afaik it expects some kind of upstream (mmdvm dmr server or dmrgateway or alike)
Ok, i can work with this, maybe I find a minimal dmr server for it where no full one is needed.
But how are the examples going?
from ok-dmrlib.
minimal mmdvm server (such as hblink3 without ACL and other features) just takes in dmr bursts wrapped in mmdvm protocol and distributes them to other clients (repeat to all scenario, "what one client sends to hblink3 will be sent to all other clients")
i still don't clearly understand your intended hardware setup, but since you want "mmdvm hardware" then the most simple setup will be "2x mmdvm hotspot (mmdvmhost on rpi or similar)" and hblink3 which will interconnect those two hotspots. Then you can monitor all the DMR traffic and inject traffic by acting as yet another "mmdvm hotspot" connected to the same hblink3
and script-wise
[SENDER SCRIPT]
- connect to hblink3 (ip, port, password) using repeater_id=1234
- generate data transmission bursts, wrap those in mmdvm protocol and send to hblink3
- this will deliver data to all connected terminals
[RECIPIENT SCRIPT]
- connect to hblink3 (ip, port, password) using repeater_id=4321
- wait for bursts to arrive, decode data transmission and extract contents
does this seem useful to you?
from ok-dmrlib.
forgot to tag you @LaneaLucy
from ok-dmrlib.
@smarek
I want to do: computer --- rf --- computer,
Computer ---- rf --- network --- computer and
Computer --- network --- computer.
I just want to be able to send whatever text messages for the beginning over rf and network over dmr between two or more computer
from ok-dmrlib.
@LaneaLucy
so if hblink connects two computers, you're happy with encoding and decoding the message as dmr data transmission
if it has rf nodes connected, it will transmit over rf and if rf recipient is setup correctly, it will receive valid dmr data transmission. seems like my proposal will work for you, i'll stich that up
from ok-dmrlib.
@smarek
If it wouldn't much more work for you, it would be great if you could tell me, what difference i need to set up for the rf recipient. Thx
from ok-dmrlib.
@LaneaLucy that depends entirely on the hardware you own, i cannot help you im afraid, i assume you can transfer message from pc[mmdvm hotspot + hblink3] to pc[dmr terminal], i don't think you can just use two mmdvmhosts to rf-connect two computers, i think you need dmr terminal at least on one side of the solution. Also the easiest way would be to have two dmr terminals in DMO, but then we'd not be dealing with MMDVM but terminal-specific-protocol (such as hytera HRNP/HDAP) and respective serial interfaces.
Can you diagram your network model with respective hardware you intend to use? Then I'd maybe be able to help more
from ok-dmrlib.
@smarek rf path would be just mmdvm as hardware if possible, because they are easy to get
from ok-dmrlib.
@smarek rf path would be just mmdvm as hardware if possible, because they are easy to get
I dont think its possible to connect two mmdvm modems in DMO. Do you think its possible? Can you link devices and settings/config of mmdvmhost maybe? Id be interested but i dont work with hardware, so i dont know if it can be done
from ok-dmrlib.
Related Issues (6)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from ok-dmrlib.